import { reqHomeData } from '_a';
import type { TableData, Column } from '@/types/homeTable.ts';
import { Ref } from 'vue';
import { BlockType } from '@/types/api';
import { errorReport } from '@/utils/tools';
import config from '@/config/index.ts';
import { radioNum } from '@/types/filter';
// radioValue - 上榜过滤  tabValue -全部，行业，概念
export default (radioValue: Ref<string>, tabValue: Ref<BlockType>) => {
  const instance = getCurrentInstance() as any;
  // table数据
  const tableDataArr = ref<TableData[][]>([[], [], []]);
  const getColumns = (item: Column) => {
    const columnsDefault = [
      { key: 'rank', name: '排序' },
      { key: 'name', name: '板块名称' },
      { key: 'rankChange', name: '排名变化' }
    ];
    columnsDefault.splice(2, 0, item);
    return columnsDefault;
  };
  const tipsContentArr = config.tipsArr;
  const columnsArr: Column[][] = [
    getColumns({
      key: 'value',
      name: '1日涨幅',
      hasIcon: true,
      content: tipsContentArr[0].valueTips
    }),
    getColumns({
      key: 'value',
      name: 'G占比',
      hasIcon: true,
      content: tipsContentArr[1].valueTips
    }),
    getColumns({
      key: 'value',
      name: '牛占比',
      hasIcon: true,
      content: tipsContentArr[2].valueTips
    })
  ];
  const titleArr: string[] = ['短', '中', '长'];
  // 定义一个函数，用于计算tableData中每个元素的turnover_percent成交额数值属性
  const setTurnoverPersent = (tableData: TableData[], maxTurnover: number) => {
    // 遍历tableData数组
    tableData.forEach(item => {
      // 计算每个元素的turnover_percent属性，等于turnover除以maxTurnover再乘以100
      item.customTurnoverPercent = (item.turnover / maxTurnover) * 100;
    });
    return tableData;
  };
  // 设置名次
  const setRadioRank = (tableDataArr: TableData[][], isToggle: boolean = false) => {
    // 同时存在的板块代码
    let resultCodeArr: string[] = [];
    // 暂存同时存在的板块代码
    let tempCodeArr: string[] = [];
    // 过滤器数组
    const radioValueArr = radioValue.value.split(',');
    // 检索是否是同时存在的板块，最终得到resultCodeArr
    const setCodeArr = (tableDataArrItem: TableData[], isFirst: boolean = false) => {
      tableDataArrItem.forEach(item => {
        if (isFirst || resultCodeArr.includes(item.code)) {
          tempCodeArr.push(item.code);
        }
      });
      resultCodeArr = JSON.parse(JSON.stringify(tempCodeArr));
      tempCodeArr = [];
    };
    // 因为如果选中短期中期上榜，需要把长期排除掉。产品需要的是只要短期中期上榜
    const excludeCodeArr = () => {
      const excludeRadio = [radioNum.short, radioNum.medium, radioNum.long].filter(
        item => !radioValueArr.includes(`${item}`)
      );
      excludeRadio.forEach(item => {
        tableDataArr[+item].forEach(i => {
          const index = resultCodeArr.indexOf(i.code);
          if (index > -1) {
            resultCodeArr.splice(index, 1);
          }
        });
      });
    };
    if (radioValue.value) {
      // 先将索引排序，让0也就是短期在最后，这样符合产品逻辑根据短期表格顺序排名次
      radioValueArr
        .sort((prev, next) => +next - +prev)
        .forEach((item, index) => {
          setCodeArr(tableDataArr[+item], index === 0);
        });
      excludeCodeArr();
    }

    // 索引是板块代码，value是名次
    const rankOptions = {
      [resultCodeArr[radioNum.short]]: 1,
      [resultCodeArr[radioNum.medium]]: 2,
      [resultCodeArr[radioNum.long]]: 3
    };
    // 是否存在排名
    let existRank = false;
    // 为表格赋名次
    tableDataArr.forEach((item, index) => {
      item.forEach(i => {
        // 名次
        const radioRank = rankOptions[i.code];
        if (radioValueArr.includes(`${index}`) && radioRank) {
          i.radioRank = radioRank;
          existRank = true;
        } else {
          i.radioRank = 0;
        }
      });
    });
    if (!existRank && isToggle) {
      instance.proxy.$messageInfo('目前没有符合既定条件的上榜板块');
    }
  };
  const date = ref('');

  const homeLoading = ref(true);
  /**
   * 获取首页数据的方法。
   * 该方法首先发送请求以获取首页数据，然后根据返回的数据更新相关变量。
   * 如果在获取或处理数据过程中发生错误，会捕获并报告错误。
   */
  const getHomeData = () =>
    reqHomeData({ block_type: tabValue.value })
      .then(res => {
        // 更新日期
        date.value = res.date;
        // 最大长度
        const MAXLEN = 20;
        // 获取短、中、长排名的前MAXLEN项
        const shortArr = res.short_rank.slice(0, MAXLEN);
        const mediumArr = res.medium_rank.slice(0, MAXLEN);
        const longArr = res.long_rank.slice(0, MAXLEN);
        // 合并所有的排名数组
        const allArr = [...shortArr, ...mediumArr, ...longArr];
        // 查找最大成交额
        let maxTurnover = 0;
        allArr.forEach(item => {
          if (item.turnover > maxTurnover) {
            maxTurnover = item.turnover;
          }
        });
        // 将短、中、长排名的数组组合成一个数组
        const tableArr = [shortArr, mediumArr, longArr];
        const result: TableData[][] = [];
        // 计算每个项目的成交额百分比，并更新表格数据数组
        tableArr
          .map(item => setTurnoverPersent(item, maxTurnover))
          .forEach((item, index) => {
            result[index] = item;
          });
        tableDataArr.value = result;
        // 设置表格数据数组
        setRadioRank(tableDataArr.value);
      })
      .catch(error => {
        errorReport({
          name: `首页获取数据失败。${error.name}`,
          message: error.message,
          stack: error.stack
        });
      })
      .finally(() => {
        homeLoading.value = false;
      });

  return {
    date,
    tableDataArr,
    columnsArr,
    titleArr,
    setRadioRank,
    getHomeData,
    homeLoading
  };
};
